package main

import "fmt"

/**
多态
	同一个接口使用不同的实例，实现不同的操作
	函数：不属于任何对象，只是一种声明，所以类对象都可以使用
	方法：存在于具体的对象中，是某个对象的某个具体的实现
*/
func main() {
	var stu Student02
	var tea Teacher02
	/**
	同一个接口，传递的参数不同，最终执行的结果也是不同的
	*/
	whoSout(&stu) //helloStudent
	whoSout(&tea) //helloTeacher
}

/**
定义一个接口
*/
type Personer02 interface {
	//声明一个方法
	sout()
}

type Student02 struct {
}

//Student中定义这样一个方法，也叫做sout
func (s *Student02) sout() {
	fmt.Println("helloStudent")
}

type Teacher02 struct {
}

//Student中定义这样一个方法，也叫做sout
func (t *Teacher02) sout() {
	fmt.Println("helloTeacher")
}

//定义方法，方法中传入的是一个接口类型
func whoSout(p Personer02) {
	p.sout()
}
